<?php

/**
 *
 * ClassName: Qq_client
 *
 * 腾讯微博 客户端
 *
 * @author hejigui <hejigui@soften.cn>
 *
 */
class tencent_client {

    const METHOD_GET = 'GET';
	/**
	* access_token
	* 用户每次登录 access_token都会更新,不论是否过期
	*
	* @var string
	*/
    private $access_token;

	/**
	* refresh_token
	* 用户每次登录 refresh_token都会更新,不论是否过期
	*
	* @var string
	*/
    private $refresh_token;

	/**
	* openid
	*
	* @var string
	*/
    private $openid;

    /**
    * oauth对象
    *
    * @var object
    */
	private $oauth;

	/**
     *
     * Constructor
     *
     * @author hejigui <hejigui@soften.cn>
     *
     */
	public function __construct($config) {
        $this->_ci = & get_instance();
        $this->_ci->config->load('openplatforms', TRUE);
        $openplatforms = $this->_ci->config->item('openplatforms');
        $this->_aip_config  = $openplatforms['openplatforms']['apisearch']['tencent'];

		$this->access_token = $config['token_info']['access_token'] ? $config['token_info']['access_token'] : null;
	    $this->refresh_token = $config['token_info']['refresh_token'] ? $config['token_info']['refresh_token'] : null;
		$this->openid = $config['token_info']['openid'] ? $config['token_info']['openid'] : null;
        $this->client_id = $config['app_info']['appkey'] ? $config['app_info']['appkey'] : null;
        $this->client_secret  = $config['app_info']['appkey'] ? $config['app_info']['appkey'] : null;
	}

    //获取客户端IP
    public function getClientIp()
    {
        if (getenv ( "HTTP_CLIENT_IP" ) && strcasecmp ( getenv ( "HTTP_CLIENT_IP" ), "unknown" ))
            $ip = getenv ( "HTTP_CLIENT_IP" );
        else if (getenv ( "HTTP_X_FORWARDED_FOR" ) && strcasecmp ( getenv ( "HTTP_X_FORWARDED_FOR" ), "unknown" ))
            $ip = getenv ( "HTTP_X_FORWARDED_FOR" );
        else if (getenv ( "REMOTE_ADDR" ) && strcasecmp ( getenv ( "REMOTE_ADDR" ), "unknown" ))
            $ip = getenv ( "REMOTE_ADDR" );
        else if (isset ( $_SERVER ['REMOTE_ADDR'] ) && $_SERVER ['REMOTE_ADDR'] && strcasecmp ( $_SERVER ['REMOTE_ADDR'], "unknown" ))
            $ip = $_SERVER ['REMOTE_ADDR'];
        else
            $ip = "unknown";
        return ($ip);
    }

	/**
     * 生成签名
     * @param string    $method 请求方法 "get" or "post"
     * @param string    $url_path
     * @param array     $params 表单参数
     * @param string    $secret 密钥
     */
    public function makeSig($method, $url_path, $params, $secret)
    {
        $mk = $this->makeSource( $method, $url_path, $params );
        $my_sign = hash_hmac ( "sha1", $mk, strtr ( $secret, '-_', '+/' ), true );
        $my_sign = base64_encode ( $my_sign );
        return $my_sign;
    }

    private function makeSource($method, $url_path, $params)
    {
        ksort ( $params );
        $strs = strtoupper($method) . '&' . rawurlencode ( $url_path ) . '&';
        $str = "";
        foreach ( $params as $key => $val ) {
            $str .= "$key=$val&";
        }
        $strc = substr ( $str, 0, strlen ( $str ) - 1 );
        return $strs . rawurlencode ( $strc );
    }

    /**
     * 发起一个腾讯API请求
     * @param $command 接口名称 如：t/add
     * @param $params 接口参数  array('content'=>'test');
     * @param $method 请求方式 POST|GET
     * @param $multi 图片信息
     * @return string
     */
    public function api($params)
    {

        //鉴权参数
        $params['postData']['access_token']         = $this->access_token;
        $params['postData']['oauth_consumer_key']   = $this->client_id;
        $params['postData']['openid']               = $this->openid;
        $params['postData']['oauth_version']        = $this->_aip_config['oauth_version'];
        $params['postData']['clientip']             = $this->getClientIp();
        $params['postData']['scope']                = 'all';
        //$params['appfrom']              = $this->_aip_config['appfrom'];
        //$params['seqid']                = time();
        //$params['serverip']             = $_SERVER['SERVER_ADDR'];

        //请求接口
        //

		//生成签名
		//$urls = @parse_url($url);
		//$sig = $this->makeSig($method, $urls['path'], $params, $this->client_secret.'&');
		//$params['sig'] = $sig;


        //$response = $this->oauth->request($url, $params, $method, $multi);
        //$response = preg_replace('/[^\x20-\xff]*/', "", $response); //清除不可见字符
        //$response = iconv("utf-8", "utf-8//ignore", $response); //UTF-8转码

        /*if($params['format'] == 'json'){
        	return json_decode($response,true);
        }else{
        	return $response;
        }*/
        return $params;
    }

	/**
    * search
    *
    * @access public
    * @param format		是	返回数据的格式（json或xml）
    * @param keyword		是	搜索关键字（1-128字节）
    * @param pagesize	是	每页大小（1-30个）
    * @param page		是	页码
    * @param contenttype	是	消息的正文类型（按位使用） 0-所有，0x01-纯文本，0x02-包含url，0x04-包含图片，0x08-包含视频，0x10-包含音频
    * @param sorttype	是	排序方式 0-表示按默认方式排序(即时间排序(最新))
    * @param msgtype		是	消息的类型（按位使用） 0-所有，1-原创发表，2 转载，8-回复(针对一个消息，进行对话)，0x10-空回(点击客人页，进行对话)
    * @param searchtype	可选	搜索类型 0-默认搜索类型（现在为模糊搜索） 1-模糊搜索：时间参数starttime和endtime间隔小于一小时，时间参数会调整为starttime前endtime后的整点，即调整间隔为1小时 8-实时搜索：选择实时搜索，起止时间如果设置为0的话，默认返回最近15分钟之内的微博数据，否则，起止时间参数的区间需要设置为最近的十五分钟范围内才生效。
    * @param starttime	是	开始时间，用UNIX时间表示（从1970年1月1日0时0分0秒起至现在的总秒数）
    * @param endtime	是	结束时间，与starttime一起使用（必须大于starttime）
    * @param longitue	是	经度，（实数）*1000000
    * @param latitude	是	纬度，（实数）*1000000
    * @param radius		是	半径（整数，单位米，不大于20000）
    * @param province	可选	发表微博的用户所在的省代码。 省份名称与代码的对应关系请参见 国家省份名称对应代码列表。 可选。如果不填默认为忽略地点搜索。
    * @param city		可选	发表微博的用户所在的市代码。城市名称与代码的对应关系请参见 国家城市名称对应代码列表。 可选。如果不填默认为按省搜索。
    * @param needdup	可选	用于结果过滤，0：全量结果；1：精简后结果。默认为0。
    * @param vip		可选	用于名人搜索，0：非名人；1：名人。默认为0。
	* @return string $mixed
    */
    public function search($keyword ,$page,$starttime = 0, $pagesize=30,$format = 'json') {

    	//如果开始时间是15分钟前的..则直接从0开始，即:起止时间如果设置为0的话，默认返回最近15分钟之内的微博数据
    	if($starttime > (time() - 15*60)) $starttime = 0;


    	$command = $this->_aip_config['search'];

		$params['postData']['keyword'] = $keyword;
		$params['postData']['page'] = $page;
		$params['postData']['pagesize'] = $pagesize;
		$params['postData']['format'] = $format;
//		$params['postData']['searchtype'] = 8;//实时搜索
//		$params['postData']['starttime'] = $starttime;
//		$params['postData']['endtime'] = time();

        $params = $this->api($params);
        $params['url'] = $this->_aip_config['url'].trim($command, '/');
        $params['method'] = self::METHOD_GET;
        return $params;
    }

	/**
    * home_timeline
    *
    * @access public
    * @param format		是	返回数据的格式（json或xml）
    * @param pageflag	是	分页标识（0：第一页，1：向下翻页，2：向上翻页
    * @param pagetime	是	本页起始时间（第一页：填0，向上翻页：填上一次请求返回的第一条记录时间，向下翻页：填上一次请求返回的最后一条记录时间）
    * @param reqnum		是	每次请求记录的条数（1-70条）
    * @param type		是	拉取类型（需填写十进制数字）0x1 原创发表 0x2 转载 如需拉取多个类型请使用|，如(0x1|0x2)得到3，则type=3即可，填零表示拉取所有类型
    * @param contenttype	是	内容过滤。0-表示所有类型，1-带文本，2-带链接，4-带图片，8-带视频，0x10-带音频 建议不使用contenttype为1的类型，如果要拉取只有文本的微博，建议使用0x80
    * @return string $mixed
    */
    public function home_timeline($pageflag=0,$pagetime= 0, $reqnum=70,$type=0,$contenttype = 0,$format = 'json') {

    	$command = 'statuses/home_timeline';

		$params['pageflag'] = $pageflag;
		$params['pagetime'] = $pagetime;
		$params['reqnum'] = $reqnum;
		$params['type'] = $type;
		$params['contenttype'] = $contenttype;
		$params['format'] = $format;

    	return $this->api($command, $params);
    }

	/**
    *
    * 获取某个用户的简单资料
    * @access public
    * @param    uid 他人的帐户名
    * @param    fopenid 他人的openid
    * @fopenid  format 返回数据的格式（json或xml）
    * @return string $mixed
    */
    public function other_info($uid= '', $fopenid='', $format = 'json') {
   		if (empty($fopenid) && empty($uid)) exit('Qq_client other_info name or fopenid is null');

    	$command = 'user/other_info';

		$params['name'] = $uid;
		$params['fopenid'] = $fopenid;
		$params['format'] = $format;

    	return $this->api($command, $params);
    }

	/**
    *
    * 关注某用户
    * @access public
    * @param   name 微博帐号
    * @fopenid  format 返回数据的格式（json或xml）
    * @return string $mixed
    */
    public function friends_add($name = '', $fopenids = '', $format = 'json') {

   		if (empty($name)&&empty($fopenids)) exit('Qq_client friends_add name or fopenids is null');

    	$command = 'friends/add';

		if($name)
			$params['name'] = $name;
        else
			$params['fopenids'] = $fopenids;

		$params['format'] = $format;

    	return $this->api($command, $params);

    }

	/**
    *
    * 取消关注某用户
    * @access public
    * @param    name 微博帐号
    * @fopenid  format 返回数据的格式（json或xml）
    * @return string $mixed
    */
    public function friends_del($name = '', $fopenids = '', $format = 'json') {
   		if (empty($name)&&empty($fopenids)) exit('Qq_client friends_add name or fopenids is null');

    	$command = 'friends/del';

		if($name)
			$params['name'] = $name;
        else
			$params['fopenids'] = $fopenids;

		$params['format'] = $format;

    	return $this->api($command, $params);
    }
}
// ClassName Qq_client End